package com.liouxb.data.structure.linkedlist;

/**
 * 单链表
 *
 * @author liouwb
 */
public class SingleLinkedListDemo {

    public static void main(String[] args) {
        // 测试
        LinkedNode linkedNode1 = new LinkedNode(1);
        LinkedNode linkedNode2 = new LinkedNode(2);
        LinkedNode linkedNode3 = new LinkedNode(3);
        LinkedNode linkedNode4 = new LinkedNode(4);

        // 添加链表
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.add(linkedNode1);
        singleLinkedList.add(linkedNode2);
        singleLinkedList.add(linkedNode3);
        singleLinkedList.add(linkedNode4);

        // 显示链表
        singleLinkedList.showLinkedList();

    }

    /**
     * 定义单链表类
     * 管理链表的每一个节点
     */
    static class SingleLinkedList {
        // 初始化头节点
        LinkedNode head = new LinkedNode(0);

        /**
         * 添加节点到单向链表
         * 1、找到链表的最后一个节点
         * 2、把最后节点的next指向新的节点
         */
        void add(LinkedNode linkedNode) {
            // 创建一个临时节点执行头节点，头节点不能动，动的话会打乱链表结构
            LinkedNode temp = head;

            // 1、找到链表的最后位置
            // 循环遍历找到最后位置
            for (; true; ) {
                if (temp.next == null) {
                    break;
                }

                // 没有找到最后，temp后移
                temp = temp.next;
            }

            // 循环退出说明temp已经是最后一个节点
            // 把最后一个节点的next指向新的元素
            temp.next = linkedNode;
        }



        /**
         * 遍历显示链表
         */
        void showLinkedList() {
            if (this.head.next == null) {
                System.out.println("链表数据为空");

                return;
            }

            // 通过辅助变量来遍历链表
            LinkedNode temp = this.head.next;

            // 循环遍历链表
            while (true) {
                if (temp == null) {
                    break;
                }

                // 输出节点
                System.out.println(temp.dataNode);
                // next 后移
                temp = temp.next;
            }

        }
    }


    /**
     * 链表的节点
     */
    static class LinkedNode {
        // 数据节点
        private int dataNode;

        // 下一个节点
        private LinkedNode next;

        /**
         * 构造函数
         *
         * @param dataNode 数据元素
         */
        public LinkedNode(int dataNode) {
            this.dataNode = dataNode;
        }
    }
}
